package demo1;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 石方旭
 * Date: 2022-04-09
 * Time: 18:03
 */
abstract class Shape {
    //抽象方法一定要在抽象类里面
    //但是抽象类不一定要有抽象方法
   abstract void draw();//被abstract修饰的方法是抽象方法 修饰的类叫做抽象类
   //abstract private void draw();//抽象类不能用private来修饰
   //abstract static void draw();//抽象类也不能用static修饰
   //final abstract void draw();//抽象类也不能被final修饰
    //抽象类除了不能实例化以外其他与普通类一样，可以在抽象类中定义方法和成员变量
//    public String name;
//    public void eat() {
//        System.out.println();
//    }
}
//抽象类存在最大的意义就是被继承，因为他不能实例化对象，但是他可以实例化子类对象
//抽象类由于不能实例化对象，如果想要使用就必须创建子类对象，要让子类重写父类的方法
//如果一个方法是抽象方法，那必须是抽象类，抽象类中不一定要有抽象方法
//如果该抽象类被继承，子类中必须重写该抽象类的所有方法，或者声明该子类为抽象类

//如果你想设计一个类，这个类包含特有的成员方法，可以让这个方法在子类中实现，并让其在父类(抽象类)中声明该抽象方法
class A extends Shape{
     //继承抽象类的子类要重写父类的方法否则会报错，还有一种方法就是把这个类也用abstract修饰
     @Override
     void draw() {

     }
}

public class TestDemo1 {

    public static void main(String[] args) {
        //Shape shape =  new Shape();//抽象类不能被实例化
        Shape shape1 = new A();//抽象类不可以实例化自己但是可以实例化子类，发生向上转型进而发生多态
    }

}
